package cn.kgc.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import static cn.kgc.base.SystemConstant.*;

/**
 * @author YC
 * 认证过滤器
 * 从请求头中获取登录用户的ID和登录类型，保存在ThreadLocal线程变量中
 */
@Component
public class JwtInterceptor implements HandlerInterceptor {

    /**
     * 存储当前登录的用户Id（求职者或招聘者）
     */
    public static ThreadLocal<String> userIds = new ThreadLocal<>();
    /**
     * 存储当前登录的管理员信息
     */
    public static ThreadLocal<String> adminUserIds = new ThreadLocal<>();

    /**
     * 在请求处理之前进行调用（Controller方法调用之前）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String loginType = request.getHeader(HEAD_LOGIN_TYPE);
        String userId = request.getHeader(HEAD_USER_ID);
        if (LOGIN_TYPE_APP.equals(loginType) || LOGIN_TYPE_SAAS.equals(loginType)) {
            // 登录类型是求职者或招聘者使用APP端一键注册登录或SASS平台扫码登录
            userIds.set(userId);
        } else if (LOGIN_TYPE_ADMIN.equals(loginType)) {
            // 后台管理人员账号密码登录
            adminUserIds.set(userId);
        }
        return true;
    }

    /**
     * 此项目不需要
     * 在请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 在整个请求结束之后被调用，也就是在DispatcherServlet渲染了对应的视图之后执行（主要是用于进行资源清理工作）
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清除线程变量
        userIds.remove();
        adminUserIds.remove();
    }

}
